import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.decomposition import PCA

# 1.	对iris数据进行如下操作
# (1)	数据预处理
# ①	使用sklearn，调用iris数据（10分）
# ②	将数据分为x，y（10分）
x, y = load_iris(return_X_y=True)
m = len(x)

# (2)	降维处理
# ①	使用PCA降维，将特征降维成三维（10分）
pca = PCA(n_components=3)
x3 = pca.fit_transform(x)

# ②	打印降维后各特征方差比例（10分）
print(f'降维后各特征方差比例: {pca.explained_variance_ratio_}')

# ③	打印降维后各特征方差（10分）
print(f'降维后各特征方差: {pca.explained_variance_}')

# ④	使用转置方式将特征数据还原（10分）  # ATTENTION How ?
x_orig = pca.inverse_transform(x3)

# ⑤	使用SVD，将数据降成二维（10分）
mu = np.mean(x, axis=0)
x_centered = x - mu
x_centered_t = x_centered.T
# cov_mat = np.dot(x_centered_t, x_centered) / m  # ATTENTION How to get cov by lib ? => np.cov(x.T)
cov_mat = np.cov(x_centered_t)
u, s, vt = np.linalg.svd(cov_mat)
u2 = u[:, :2]  # ATTENTION
x2 = np.dot(x_centered, u2)

# (3)		 使用散点图，绘制降维后数据和y的关系
# ①	  X轴为降维后第一个数据，y轴为降维后第二个数据（10分）
# ②	颜色使用y标签确定（10分）
# ③	显示图像（10分）
plt.scatter(x2[:, 0], x2[:, 1], c=y)
plt.show()
